var obj = {}

// const dec = Object.getOwnPropertyDescriptor(obj,'a')
// console.log(dec)
// configurable:true  通俗 属性不能修改 不能重新修改属性
// enumerable:true 是否可以遍历
// value:1  值
// writable:true 是否可以重写
// [[Value]] : 包含这个属性的数据值。读取属性时从这个位置读取；写入属性时，把新值保存在这个位置。这个特性的值默认为 undefined 。
// [[Writable]] : 表示能否修改属性的值，即值是可写的还是只读。
// [[Enumaerable]] : 目标属性是否可被枚举（遍历）。
// [[Configurable]] : 表示能否通过 delete 删除属性、能否修改属性的特性，或者将属性修改为访问器属性。

// Object.defineProperty(obj,'a',{
//   value:10,
//   writable:false,
//   enumerable:false,
//   configurable:false
// })

// Object.defineProperty(obj,'a',{
//   value:1,
//   writable:false,
//   enumerable:false,
//   configurable:true
// })
// 直接报错提示
// Uncaught TypeError: Cannot redefine property: a
// at Function.defineProperty (<anonymous>)


Object.defineProperty(obj,'a',{

  // 读取器 getter
  get:function () { 
      console.log("皮果果")
      return 123
   },
   // 设置器 setter
   set:function(val){
    console.log("皮果果去了",val)
   }
})
obj.a = obj.a + 2  // set（get()+2）
console.log(obj.a) // console.logf(get())